﻿using System;
using System.Data;
using System.Data.SqlClient;
using consultasSql.consultasVarias;
using consultasSql.generic.Accesorio;
using consultasSql.generic.Insumo;

/// <summary>
/// Descripción breve de CSelectCable
/// </summary>

namespace consultasSql.consultaAbm.Impresion
{
    public class CConsultaImpresion : CDarDataSet
    {

        /*SELECT*/
        public DataSet select(bool deBaja, string descripcion, string largo, string ancho, string orden)
        {
            # region Descripcion Filter
            string descripcionString = "";
            if (!String.IsNullOrEmpty(descripcion.Trim()))
            {
                if (descripcion.Trim().Substring(0, 1) == "*")
                {
                    descripcionString = " AND RTRIM(LTRIM(descripcion)) LIKE '%' + @descripcion ";
                }
                else
                {
                    if (descripcion.Trim().Substring(descripcion.Trim().Length - 1, 1) == "*")
                        descripcionString = " AND RTRIM(LTRIM(descripcion)) LIKE @descripcion + '%' ";
                    else
                        descripcionString = " AND RTRIM(LTRIM(descripcion)) LIKE @descripcion ";
                }
            }
            # endregion

            # region Largo Filter
            string largoString = "";
            if (!String.IsNullOrEmpty(largo.ToString().Trim()))
            {
                if (largo.ToString().Trim().Substring(0, 1) == "*")
                {
                    largoString = " AND RTRIM(LTRIM(pliegoLargo)) LIKE '%' + @pliegoLargo ";
                }
                else
                {
                    if (largo.ToString().Trim().Substring(largo.ToString().Trim().Length - 1, 1) == "*")
                        largoString = " AND RTRIM(LTRIM(pliegoLargo)) LIKE @pliegoLargo + '%' ";
                    else
                        largoString = " AND RTRIM(LTRIM(pliegoLargo)) LIKE @pliegoLargo ";
                }
            }
            # endregion

            # region Ancho Filter
            string anchoString = "";
            if (!String.IsNullOrEmpty(ancho.ToString().Trim()))
            {
                if (ancho.ToString().Trim().Substring(0, 1) == "*")
                {
                    anchoString = " AND RTRIM(LTRIM(pliegoAncho)) LIKE '%' + @pliegoAncho ";
                }
                else
                {
                    if (ancho.ToString().Trim().Substring(ancho.ToString().Trim().Length - 1, 1) == "*")
                        anchoString = " AND RTRIM(LTRIM(pliegoAncho)) LIKE @pliegoAncho + '%' ";
                    else
                        anchoString = " AND RTRIM(LTRIM(pliegoAncho)) LIKE @pliegoAncho ";
                }
            }
            # endregion

            # region Orden
            string ordenString = "";
            if (!String.IsNullOrEmpty(orden.Trim()))
                ordenString = " ORDER BY " + orden.Trim();
            # endregion

            string consulta = "SELECT id, descripcion, insumoTipoMaterialId, insumoGramajeId, " +
            " pliegoLargo, pliegoAncho, insumoCantidadColoresImpresionId, insumoBocaId, costo, deBaja, insumoFazId, barnizUV, tipoDeTrabajo " +
            " FROM Impresiones " +
            " WHERE DeBaja = @deBaja " + descripcionString + anchoString + largoString + ordenString;

            SqlCommand command = new SqlCommand();
            command.CommandType = CommandType.Text;
            command.CommandText = consulta;
            command.Parameters.Clear();

            command.Parameters.Add(new SqlParameter("@deBaja", SqlDbType.Int));
            command.Parameters["@deBaja"].Value = deBaja;

            if (!String.IsNullOrEmpty(descripcion.Trim()))
            {
                command.Parameters.AddWithValue("@descripcion", descripcion.Trim().Replace("*", ""));
            }

            if (!String.IsNullOrEmpty(largo.ToString().Trim()))
            {
                command.Parameters.AddWithValue("@pliegoLargo", largo.ToString().Trim().Replace("*", ""));
            }

            if (!String.IsNullOrEmpty(ancho.ToString().Trim()))
            {
                command.Parameters.AddWithValue("@pliegoAncho", ancho.ToString().Trim().Replace("*", ""));
            }

            return darDataSet(command);
        }

        /*UPDATE*/
        public bool update(CImpresion objeto)
        {
            bool bandera = false;

            string consulta = "UPDATE Impresiones SET descripcion = @descripcion, insumoTipoMaterialId = @insumoTipoMaterialId, " +
            " insumoGramajeId = @insumoGramajeId, pliegoLargo = @pliegoLargo, pliegoAncho = @pliegoAncho, insumoCantidadColoresImpresionId = @insumoCantidadColoresImpresionId, " +
            " insumoBocaId = @insumoBocaId, costo = @costo, deBaja = @deBaja, " +
            " insumoFazId = @insumoFazId, barnizUV = @barnizUV, tipoDeTrabajo = @tipoDeTrabajo " +
            " WHERE id = @id";

            using (SqlConnection objConexion = new SqlConnection(CCadenaConexionSql.cadConexion()))
            {
                using (SqlCommand command = new SqlCommand())
                {
                    if (objConexion.State == ConnectionState.Closed)
                    { objConexion.Open(); }

                    SqlTransaction tr = objConexion.BeginTransaction();

                    try
                    {
                        command.CommandType = CommandType.Text;
                        command.CommandText = consulta;
                        command.Transaction = tr;

                        command.Parameters.Clear();

                        # region Parámetros
                        command.Parameters.Add(new SqlParameter("@id", objeto.id));
                        command.Parameters.Add(new SqlParameter("@descripcion", objeto.descripcion));
                        command.Parameters.Add(new SqlParameter("@insumoTipoMaterialId", objeto.insumoTipoMaterial.id));
                        command.Parameters.Add(new SqlParameter("@insumoGramajeId", objeto.insumoGramaje.id));
                        command.Parameters.Add(new SqlParameter("@pliegoLargo", objeto.pliegoLargo));
                        command.Parameters.Add(new SqlParameter("@pliegoAncho", objeto.pliegoAncho));
                        command.Parameters.Add(new SqlParameter("@insumoCantidadColoresImpresionId", objeto.insumoCantidadColoresImpresion.id));
                        command.Parameters.Add(new SqlParameter("@insumoBocaId", objeto.insumoBoca.id));
                        command.Parameters.Add(new SqlParameter("@costo", objeto.costo));
                        command.Parameters.Add(new SqlParameter("@barnizUV", objeto.barnizUV));
                        command.Parameters.Add(new SqlParameter("@insumoFazId", objeto.insumoFaz.id));
                        command.Parameters.Add(new SqlParameter("@tipoDeTrabajo", objeto.tipoDeTrabajo));

                        command.Parameters.AddWithValue("@deBaja", objeto.deBaja);
                        # endregion

                        CConsultaInsumo consultaInsumo = new CConsultaInsumo();
                        # region Tintas
                        consultaInsumo.deleteAllMuchosAMuchos(objeto.id, objConexion, tr, "Impresiones_Tintas");
                        foreach (CInsumo tinta in objeto.tintas)
                            consultaInsumo.insertMuchosAMuchos(tinta, objeto.id, objConexion, tr, "Impresiones_Tintas");
                        # endregion

                        command.Connection = objConexion;
                        command.ExecuteNonQuery();

                        bandera = true;
                        tr.Commit();
                    }
                    catch
                    {
                        bandera = false;
                        tr.Rollback();
                    }

                    if (objConexion.State == ConnectionState.Open)
                    { objConexion.Close(); }
                }
            }
            return bandera;
        }


        /*INSERT*/
        public bool insert(CImpresion objeto)
        {
            bool bandera;

            string consulta = "INSERT INTO Impresiones (id, descripcion, insumoTipoMaterialId, " +
            " insumoGramajeId, pliegoLargo, pliegoAncho, insumoCantidadColoresImpresionId, " +
            " insumoBocaId, costo, deBaja, insumoFazId, barnizUV, tipoDeTrabajo) " +

            " VALUES (@id, @descripcion, @insumoTipoMaterialId, " +
            " @insumoGramajeId, @pliegoLargo, @pliegoAncho, @insumoCantidadColoresImpresionId, " +
            " @insumoBocaId, @costo, @deBaja, @insumoFazId, @barnizUV, @tipoDeTrabajo)";

            using (SqlConnection objConexion = new SqlConnection(CCadenaConexionSql.cadConexion()))
            {
                using (SqlCommand command = new SqlCommand())
                {
                    if (objConexion.State == ConnectionState.Closed)
                    { objConexion.Open(); }

                    SqlTransaction tr = objConexion.BeginTransaction();
                    try
                    {
                        command.CommandType = CommandType.Text;
                        command.CommandText = consulta;
                        command.Transaction = tr;

                        command.Parameters.Clear();

                        objeto.id = BitConverter.ToInt32(Guid.NewGuid().ToByteArray(), 0);

                        # region Parámetros
                        command.Parameters.Add(new SqlParameter("@id", objeto.id));
                        command.Parameters.Add(new SqlParameter("@descripcion", objeto.descripcion));
                        command.Parameters.Add(new SqlParameter("@insumoTipoMaterialId", objeto.insumoTipoMaterial.id));
                        command.Parameters.Add(new SqlParameter("@insumoGramajeId", objeto.insumoGramaje.id));
                        command.Parameters.Add(new SqlParameter("@pliegoLargo", objeto.pliegoLargo));
                        command.Parameters.Add(new SqlParameter("@pliegoAncho", objeto.pliegoAncho));
                        command.Parameters.Add(new SqlParameter("@insumoCantidadColoresImpresionId", objeto.insumoCantidadColoresImpresion.id));
                        command.Parameters.Add(new SqlParameter("@insumoBocaId", objeto.insumoBoca.id));
                        command.Parameters.Add(new SqlParameter("@costo", objeto.costo));
                        command.Parameters.Add(new SqlParameter("@barnizUV", objeto.barnizUV));
                        command.Parameters.Add(new SqlParameter("@insumoFazId", objeto.insumoFaz.id));
                        command.Parameters.Add(new SqlParameter("@tipoDeTrabajo", objeto.tipoDeTrabajo));

                        command.Parameters.Add(new SqlParameter("@deBaja", false));
                        # endregion

                        command.Connection = objConexion;

                        command.ExecuteNonQuery();

                        CConsultaInsumo consultaInsumo = new CConsultaInsumo();
                        # region Tintas
                        foreach (CInsumo tinta in objeto.tintas)
                            consultaInsumo.insertMuchosAMuchos(tinta, objeto.id, objConexion, tr, "Impresiones_Tintas");
                        # endregion

                        bandera = true;
                        tr.Commit();
                    }
                    catch
                    {
                        bandera = false;
                        tr.Rollback();

                        if (objConexion.State == ConnectionState.Open)
                        { objConexion.Close(); }
                    }

                    if (objConexion.State == ConnectionState.Open)
                    { objConexion.Close(); }
                }
            }

            return bandera;
        }

    }
}